package com.itfenghuang.day02;

public class A02_编码史 {
    public static void main(String[] args) {
        /*
        1.  第一阶段 ASCII
            1. 在计算机中，所有的数据只可能是0或者1(用高电平和低电平分别表示1和0)，那么我们通常看到的字符也就只能用0和1来表示呀。
                于是科学家们(这里指的是美国的科学家)就想出一个办法，把一个特定的数字对应一个特定的字母进行存储和传输，
                比如我需要存储字母a，那么我存入一个数字97(即在计算机中存入二进制(01100001)，这个过程叫做编码(encode)，
                而我们在读取数据的时候，当遇到97时，我们就让计算机显示字母a，这个过程叫做解码(decode)。
            2. 为了大家在数据传输的时候不至于产生误会，那么我们需要让所有的人都使用数字97来代表字母a，
                所以需要制定一份标准(即码表)，最开始的这个标准叫做ASCII码表。
            3. 规则
                所有的控制字符(比如CR回车、DEL删除等)编码在0-31范围以及127中。
                把所有的标点符号，英文大小写全部放在32-126范围中。
                防止以后出现需要补充的情况，把128-255位这么多位置留出来，应该足够用了吧！
                所以设置一个字节8位二进制，把这个标准叫 American Standard Code for Information Interchange
                (美国标准信息交换代码，简写为ASCII)，标准制定结束。
            4.  编码实现
                第一位始终未0，后面7位表示0-127的范围，一个数字对应一个字母或者标点符号，
                亦或者控制符号，即所有的ASCII码的统一形式为0xxx xxxx。

            5. 等等，我们的中文字呢？
                美国的"砖家"没有考虑那么久远呢！这就是后面出现那么多问题的根源所在啊。
                实现方式

        2. 第二阶段 GB2312,GBK, BIG5 Latin1, ISO-8859-1, JIS, ANSI...
            1. 计算机技术到了欧洲，欧洲人发现怎么我们的那么多符号没有编进去啊！
                所以欧洲"砖家"坐到了一起，开始讨论。
                发现既然美国人把第一位流出来了，那么我们就用128-255的位置好了。
            2. 规则
                128-159之间为控制字符，160-255位文字符号，其中包括了西欧语言、希腊语、泰语、阿拉伯语、希伯来语。
                刚好把美国人给的空间全部用完，世界真美好，谢谢美利坚预留的每一个位置。
                砖家们决定把他们的编码名称叫做Latin1，后面由于欧洲统一制定ISO标准，所以又有了一个ISO的名称，即ISO-8859-1。
            3. 实现方式
                0-127的所有位置不动，那么可以兼容ASCII，二进制位0xxx xxxx
                128-255位置全部用完，二进制位1xxx xxxx
                由于所有的位置全部用完，而欧元符号实在指定标准之后才出现的，所以在这个码表中连欧洲人自己的货币符号都没有办法放进去。
            4. 计算机技术当然也传到了亚洲大地，比如中国。
                中国砖家们坐在一起发现，美国人搞的这个东西真的有问题，预留才128-255的空间，可是我们的汉字个数远远超出了这个数目啊，怎么办？？
                后面聪明的中国砖家们发现，只能使用2个字节了，否则真的搞不定。由于必须和美国原来制定的ASCII不冲突，所以指定了如下规则
            5. 规则
                5.1 GB2312
                    如果一个字节中第一位为0，那么这就是一个ASCII字符。
                    如果一个字节中第一位为1，那么这个是汉字，认定需要2个字节才表示一个编码的文字。
                    把这个码表叫GB2312
                    这个码表中包含汉字6763个和非汉字图形字符682个。
                    还有很多的空间没有用到，索性全部预留了吧。

                    实现方式
                    0xxxxxxx：表示为ASCII字符
                    1xxxxxxx 1xxxxxxx：表示为汉字     127 * 127 = 16384
                5.2 GBK
                    后来，中国砖家们发现，很多的不常用汉字没有在码表中，又增加了近20000个新的汉字（包括繁体字）和符号，这个编码叫做GBK，
                    实现方式和GB2312是完全一样的，兼容GB2312，当然也兼容ASCII。

                    实现方式
                    0xxxxxxx：表示为ASCII字符
                    1xxxxxx   xxxxxxxx：表示为汉字
                5.3 GB18030
                    后面再次添加更多的字符进去(几千个)，再次命名为GB18030，兼容GBK。
                    由于汉字很多，2个字节并不能完全包括进去，所以GB18030采用2\4位混编的形式。
                    从此之后，中华民族的文化就可以在计算机时代中传承了。

            6  当然计算机也传到了日本(JIS)、韩国、台湾(BIG5)等等地方，
                大家全部发挥自己的聪明才智，各自实现了自己的编码。这些编码都与ASCII兼容，但是相互之间不兼容。
                使用 2 个字节来代表一个字符的各种汉字延伸编码方式，称为 ANSI 编码，
                又称为"MBCS（Muilti-Bytes Charecter Set，多字节字符集）"。
                在简体中文系统下，ANSI 编码代表 GB2312 编码，在日文操作系统下，ANSI 编码代表 JIS 编码，
                所以在中文 windows下要转码成gb2312, gbk只需要把文本保存为ANSI编码即可。 不同ANSI编码之间互不兼容

       3. 第三阶段
            3.1 unicode 万国码
                随着互联网的普及，而老美发现在自己公司需要国际化的时候，自己原来埋的这个雷真的害了自己。
                于是乎，开始研讨把世界上几乎所有文字全部放在一个码表中，而这个包罗万象的码表就叫做Unicode，即万国码。
                所以只要电脑上有 UNICODE 这种编码系统，无论是全球哪种文字，只需要保存文件的时候，保存成 UNICODE 编码就可以被其他电脑正常解释。

                实际上，在软件制造商的协会（unicode.org）在做这个工作时，国际标准化组织（ISO）在做同样的事情，
                最后大家都意识到世界上并不需要两个不同的万国码，于是大家坐在一起合并研究的成果，最后的结果就是现在的Unicode。

                Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符，
                最多可以容纳1114112个字符，或者说有1114112个码位。码位就是可以分配给字符的数字。

            3.2 utf8 和 tuf16
                Unicode只是进行了编码，也就是说只是一个码表，至于具体怎么实现，并没有规定。
                utf16: 采用两个字节或者4个字节编码 ,问题 不能兼容ascll码 ,
                utf8:  兼容ascll码表  使用 1个字节 , 两个字节 , 三个字节 ---到六个字节 混合编码   中文占用三个字节

            3.3 思考:UTF-8 既然能保存那么多文字、符号，为什么国内还有这么多使用 GBK 等编码的人？
                因为 UTF-8 等编码体积比较大，占电脑空间比较多，如果面向的使用人群绝大部分都是中国人，
                用 GBK 等编码也可以。但是目前的电脑来看，硬盘都是白菜价，电脑性能也已经足够无视这点性能的消耗了。
                所以推荐所有的网页使用统一编码：UTF-8。


        */






    }


}
